﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace MasterVNC
{
    public partial class frmMaster : Form
    {
        private ControllerMaster _Controller;

        /// <summary>
        /// Crea una nuova form associata al controllore passato come parametro.
        /// </summary>
        /// <param name="controller">il controller associato alla form.</param>
        public frmMaster(ControllerMaster controller)
        {
            _Controller = controller;
            _Controller.Form = this;
            InitializeComponent();
        }

        private void CloseButton_Click(object sender, EventArgs e)
        {
            _Controller.CloseConnection();
        }

        private void SlaveItem_Activate(object sender, EventArgs e)
        {
            string slaveName = ((ListView)sender).SelectedItems[0].Text;
            _Controller.EnabledSlave = slaveName;
        }

        ////////////////////////////////////////////////////////////////////////////////////////////////////////////

        /// <summary>
        /// Informa l'utente che lo slave indicato dal parametro sta tentando di connettersi e gli chiede se accettare la connessione o meno.
        /// </summary>
        /// <param name="slaveName">un identificativo per lo slave.</param>
        /// <returns>true se l'utente accetta la connessione, false altrimenti.</returns>
        public bool ShowAcceptConnection(string slaveName)
        {
            DialogResult result = MessageBox.Show(
                "È stata effettuata una richiesta di assistenza da parte di " + slaveName + ".\nAccettare la connessione?",
                "Tentativo di connessione",
                MessageBoxButtons.YesNo,
                MessageBoxIcon.Question);

            if (result == DialogResult.Yes)
                return true;
            else
                return false;
        }

        /// <summary>
        /// Mostra una message box di errore all'utente.
        /// </summary>
        /// <param name="message">il messaggio di errore da mostrare.</param>
        public void ShowError(string message)
        {
            MessageBox.Show(
                message,
                "Errore",
                MessageBoxButtons.OK,
                MessageBoxIcon.Error);
        }

        /// <summary>
        /// Inserisce nell'elenco degli slave un nuovo elemento identificato dalla stringa passata come parametro.
        /// </summary>
        /// <param name="slaveName">un identificativo per lo slave.</param>
        public void AddSlaveItem(string slaveName)
        {
            // ottiene l'immagine del desktop dal controller
            Image desktop = _Controller.GetWholeScreen(slaveName);

            // aggiunge l'immagine del desktop all'ImageList
            ui_DesktopList.Images.Add(slaveName, desktop);
            int index = ui_DesktopList.Images.IndexOfKey(slaveName);

            // aggiunge lo slave alla ListView
            ui_SlaveList.Items.Add(slaveName, slaveName, index);
        }

        /// <summary>
        /// Rimuove dall'elenco degli slave un nuovo elemento identificato dalla stringa passata come parametro.
        /// </summary>
        /// <param name="slaveName">l'identificativo dello slave.</param>
        public void RemoveSlaveItem(string slaveName)
        {
            // rimuove l'immagine del desktop dall'ImageList
            int index = ui_DesktopList.Images.IndexOfKey(slaveName);
            ui_DesktopList.Images.RemoveAt(index);

            // rimuove l'elemento associato allo slave dalla ListView
            ui_SlaveList.Items.RemoveByKey(slaveName);
        }

        /// <summary>
        /// Sostituisce la schermata mostrata con quella passata come parametro.
        /// </summary>
        /// <param name="screen">l'immagine della schermata da impostare.</param>
        public void ChangeScreen(Image screen)
        {
            ui_Screen.Image = screen;
        }

        /// <summary>
        /// Disegna sulla schermata mostrata la porzione di schermata passata come parametro.
        /// </summary>
        /// <param name="screen">l'immagine da disegnare sopra la schermata</param>
        /// <param name="upperLeftCorner">la posizione dell'angolo in alto a sinistra dell'immagine.</param>
        public void UpdateScreen(Image screen, Point upperLeftCorner)
        {
            ui_Screen.CreateGraphics().DrawImage(screen, upperLeftCorner);
        }
    }
}
